class Gravi
{
  // INSTANZVARIABLEN
  float m; // Masse der Himmelskörper
  float D; // Durchmesser der Himmelskörper
  PVector c;// Farbe der Himmelskörper
  PVector r; // Ortsvektor der Himmelskörper 
  PVector v; // Geschwindigkeit der Himmelskörper
  PVector a = new PVector(); // a hat den Startwert (0, 0)

  // KONSTRUKTOR
  Gravi(PVector rTemp, PVector vTemp, float mTemp, float DTemp, PVector cTemp)
  {
    /* Die obigen Instanzvariablen gelten für alle möglichen Himmelskörper.
     Nun teilen wir Processing mit, dass es für die Instanzvariablen die temporären 
     Werte verwenden soll, die wir in unseren folgenden Methoden verwenden */
    r = rTemp; 
    v = vTemp;
    m = mTemp;
    D = DTemp;
    c = cTemp;
  }

  // METHODEN (FUNKTIONEN) 
  // Die Reihenfolge der Methoden ist hier nicht von Bedeutung. Wohl aber bei void draw() im Hauptsketch

  void force(Gravi P, float G) // P ist der Name für einen beliebigen Planeten aus der Klasse Gravi. G entspricht der Gravitationskonstante
  {
    PVector n = PVector.sub(P.r, r); /* r ist der Ortsvektor des nun betrachteten Himmelskörpers. 
     P.r steht für den Ortsvektor des Wechselwirkungspartners P. n ist der vektorielle Abstand zwischen P und dem hier betrachteten Himmelskörper */
    float d = n.mag() + 1; // d ist der Betrag des Vektors n. Um die Divison durch null zu verhindern wird ein kleiner Wert (hier 1) hinzuaddiert
    n.normalize(); // Der Vektor n wird auf 1 normalisiert. Er wird zum Einheitsvektor
    PVector F = PVector.mult(n, G*m*P.m/(d*d)); // m ist die Masse des hier betrachteten Himmelskörper. P.m ist die Masse des Wechselwirkungspartners P
    a.add(PVector.div(F, m)); // Die neue Beschleunigung wird berechnet und zum Vektor a addiert
  }

  void move(float t) // Der konkrete t-Wert kann im Hauptsketch eingegeben werden
  {   
    v.add(PVector.mult(a, t));
    r.add(PVector.mult(v, t));
    a.set(0, 0); // Setzt den Vektor a wieder auf den Wert 0. Sonst würden sich die a-Werte laufend addieren
  }

  void display()
  {
    fill(c.x, c.y, c.z); // Die konkreten Werte werden im Hauptsketch eingegeben
    ellipse(r.x, r.y, D, D); // Die konkreten Werte werden im Hauptsketch eingegeben
  }
}